#include <map>
#include <iostream>

using namespace std;

#define N 10
#define OUT(map_a, msg) do{ \
    cout << msg; \
    for (auto i = map_a.begin(); i != map_a.end(); i++) cout << "key:" << i->first << " value:" << i->second << "  "; \
    cout << endl; \
}while(0)

int main(int argc, char const *argv[])
{
    /*****************************************************************************************************
     * map 键值对容器
     * ---------------------------------------------------------------------------------------------------
     * map容器中保存的最小单元是pair， map容器中的pair的键一旦确定，只能删除， 不能修改
     * map 会自动按照容器中的键将所有键值对排序
     *****************************************************************************************************/
    // -----------------------------------------------
    // --- 定义 ----
    // -----------------------------------------------
    // 默认定义
    map<string, string> students_a;
    // 初始化列表定义， 这里要注意， 相同的键，只有第一次有效
    map<string, string> students_b{{"name", "小芳"}, {"name1", "小芳"}, {"name2", "小芳"}};

    // -----------------------------------------------
    // --- 增 ----
    // -----------------------------------------------
    map<string, string> students_c;
    // 这里要注意， 新增已有的key时， 是无效的， 并不会覆盖原始数据
    students_c.insert(make_pair("key1", "value1"));
    students_c.insert(make_pair("key2", "value2"));
    OUT(students_c, "新增输出： ");
    // -----------------------------------------------
    // --- 删 ----
    // -----------------------------------------------
    students_c.erase("key1");
    OUT(students_c, "删除key1输出： ");

    // -----------------------------------------------
    // --- 改 ----
    // -----------------------------------------------
    // 通过find返回的迭代器修改值
    map<string, string>::iterator stu_i = students_c.find("key2");
    // map的键一旦确定只能删除， 无法修改， 所以不能有这样的操作： (*stu_i).first = "key_x";
    (*stu_i).second = "value_x";
    OUT(students_c, "修改值： ");

    // -----------------------------------------------
    // --- 查 ----
    // -----------------------------------------------
    map<string, string>::iterator stu_find = students_c.find("key2");
    cout << "查找 key2 信息： key=" << stu_find->first << "  value=" << stu_find->second << endl;

    /*****************************************************************************************************
     * 成员函数
     * ---------------------------------------------------------------------------------------------------
     * array.begin()        返回：随机访问迭代器  首元素位置指针   
     * 
     *****************************************************************************************************/
    
    // array.begin() 
    // -----------------------------------------------
    
    return 0;
}
